/**********************************
 * 文件:hmi接口 头文件-soap2cpp编译用
 * 创建者:林鸿铭
 * 创建时间:2016.11.3
 * copyright:(c)同川科技
 * 备注:有未确定数据类型,暂时"待定"
 * 修改者:
 **********************************/
#ifndef HMIAPI_H
#define HMIAPI_H

#include <vector>

#include <string>

#import "import/stlvector.h"

enum SERVO_STATUS_TYPE
{
    ENUM_SERVO_OFF,
    ENUM_SERVO_ON,
    ENUM_SERVO_END
};

//***************结构体部分********************************

//***GeneralDefine******************
/**
 * @brief The PointPro struct       点信息
 */
struct PointPro
{
    int jointFlag;                  //0:关节;1:笛卡尔;
    int pointNum;                   //点 编号
    int groupNum;                   //组 编号
    int ufValue;                    //用户坐标系 编号
    int utValue;                    //工具坐标系 编号
    int recordStatus;                  //在使用用户坐标系，或者是工具坐标系进行坐标系示教的时候（三点法，四点法，六点法），记录该点的示教状态，０代表未示教　　１代表已经示教
    std::string configString;       //多解 选择;多圈 选择
    std::vector<int> configInt;     //多解 选择;多圈 选择
    std::vector<float> positionValue;//关节值 or 笛卡尔值
    std::vector<float> extPositionValue;//外部轴的值，仅存在关节形式
};

/**
 * @brief 码垛点结构体。华磊修改。
 */
struct PalletPoint
{
    int palletNumber; //码垛号
    int pointType;  	  //点类型0 堆栈点。1 接近点。 2 逃离点。
    int pointNumber;  //接近点号 或 逃离点号
    std::vector<int> rowColumnLayer;//行列层
};



/**
 * @brief MoveParamater 移动参数
 */
struct MoveParameter
{
    int moveType;			//关节、直线、圆弧
    int velocityUnit;		//单位　０是百分比　１是mm/s　２是°/s
    float velocity;			//指令里面的速度值	
    struct PointPro targetPoint;//hmiAPI_update20161107.h
    struct PalletPoint palletPoint;
    int pointType;//0 普通P点, 1 码垛点, 2　PR寄存器点（华磊修改）
    int index;				//点的编号pointNum
    int cntRatio;			//cnt
    float acc;               // 加速度 类型改为float,单位是百分比
    int lineNumber;        //行号
    int wjnt;   //姿态是否控制
    int poseOffset;//0 正常，　１　直接补偿
    int poseOffsetIndex; //直接补偿PR[]
    int  toolOffset;//0 正常，　１　直接补偿
    int toolOffsetIndex; //直接补偿PR[]
    int incFlag;//0 正常，　１增量运动
    int evFlag;//附加轴运动标识。
    int evVelocity;//0-100附加轴速度比例
    int pathFlag;//路径规划曲线标识

};


//struct MotorCommand
//{
//    float motorPosition;
//    float motorVelocity;
//    float motorTorque;
//    float motorAcceleration;
//};

struct UserInfo
{
    int account;                    //用户ID
    std::string password;           //密码
    std::string ip;                 //IP地址
    std::string operationSystem;    //操作系统
};

/**
 * @brief The Message struct        信息结构体
 */
struct Message
{
    int MessageLevel;               //消息级别
    long time;						//产生时间(2017.02.10修改)
    int robotId;                    //机器人id
    std::string componentClassName; //组件类名
    std::string messageType;        //消息类型
    int messageCode;                //消息ID
    int parameter1;                 //消息参数1
    int parameter2;                 //消息参数2
    int parameter3;					//消息参数3
    int parameter4;					//消息参数4
    std::string MessageInformation; //消息内容(提供用户可见)
};

/**
 * @brief The ComponentVersion struct   组件版本
 */
struct ComponentVersion
{
    std::string componentName;               //组件名
    std::string componentVersion;            //组件版本
    std::string publishDate;                 //发布时间
};

/**
 * @brief The PrRegStruct struct            ｐｒ寄存器
 */
struct PrRegStruct
{
    int jointFlag; //0:关节;1:笛卡尔;
    std::vector <float> prValue;//pr寄存器的值

};

/**
 * @brief The PlRegStruct struct    pl寄存器
 */
struct PlRegStruct
{
    int row;//行
    int col;//列
    int layer;//层

};

//**hmi Use****************************************

/**
 * @brief The CurrentRunFile struct 当前运行程序
 */
struct CurrentRunFile
{
    std::vector<std::string> runingFileName;     //当前运行程序名(run)
    std::vector<int> runningFileLine;            //当前运行行号(对应上)

	std::vector<std::string> relatedFileName;	//所有关联程序名(call)
};

struct CommRobotInfo
{
	int robotId;					//当前控制的机器人ID

	std::string robotName;

	std::string robotSpecification;	//机器人规格

	int robotType;					//机器人类型

	std::string robotFileAddress;	//

	std::string robotPictureAddress;

	int robotStatus;

	std::string robotProgram;

	int robotRunSpeed;

};

struct AxisLimit
{
	float positive;
	float negative;
};

/**
 * @brief The ControllerIpGroupInfo struct      控制器ip组信息
 */
struct ControllerIpGroupInfo
{
    std::string ipAddress;		//ip地址
    std::string gateWay;		//网关
    std::string dnsServer;		//dns服务器
};

/**
 * @brief ToolCoordinateInformation hmi专用 工具坐标系信息(2017.02.10修改)
 */
struct HmiToolCoordinateInformation
{
    int index;
    float error;
    int method;
    std::vector<struct PointPro> pointList;
    std::vector<float> xyzwpr; //华磊增加
};

/**
 * @brief UserCoordinateInformation hmi专用 用户坐标系信息(2017.02.10修改)
 */
struct HmiUserCoordinateInformation
{
    int index;
    int method;
    std::vector<struct PointPro> pointList;
    std::vector<float> xyzwpr; //华磊增加
};

/**
 * @brief StoreStatus 存储信息结构体(2017.02.10修改)
 */
struct StoreStatus
{
	double wholeDiskMemory;		//磁盘全部容量
	double usedDiskMemory;		//磁盘已用容量

	double wholeSystemMemory;	//内存总大小
	double usedSystemMemory;	//已用内存
};


/**
 * @brief RegisterStatus 注册返回结构体(2017.02.24修改)
 */
struct ReturnRegisterStatus
{
	int returnStatus;
	std::string returnLockTime;
	std::string returnRegisterNumber;
};


//***************hmi需要更新的数据********************************
struct UpdateDataLv1
{
//int globalSerialStatus;

int globalRegStatus;			//0注册状态正常1快要过期1个星期2已经过期3永久有效4序列号不正确

std::string globalLockMachTime;	//锁机日期

std::string serialNumber;		//序列号

std::string registerNumber;		//注册码

//int globalMotorType;

std::string mainProgramVersion;

std::vector<struct ComponentVersion> componentVersionList;

//std::vector<struct UserInfo> multiUserInfo;

//int currentLanguage;

std::vector<struct AxisLimit >  axisLimit;		//轴软限位

std::vector<struct AxisLimit >  extAxisLimit;	//外部轴软限位

std::vector<int> axisUnit;			//本体轴单位

std::vector<int> extAxisUnit;		//外部轴单位 2017.03.10

int robotAxisCount;					//本体轴个数

int extAxisCount;					//外部轴个数

std::string controllerIp;			//控制器IP

std::string controllerMac;			//控制器MAC

std::vector <struct CommRobotInfo>  robotInfoList;

};

struct UpdateDataLv2
{
	//std::vector<struct Message> messageVector;//20161108

	int globalSafePointFlag;

	int globalHandSwitch;

	float globalProSpeed;

	float globalManSpeed;

	int globalHandRunStatus;

	int globalZeroCtrlFlag;

	int globalCoordinate;

	int globalCurrentState;

	int globalHandState;

	int globalServoState;

	int globalZeroStatus;

	int emergencyStatus;

	int globalPosType;

	int globalDefaultUserNum;

	int globalDefaultToolNum;

	int startType;

	struct PointPro currentPositionJoint;

	struct PointPro currentPositionWorld;

	//std::vector<bool> ioIn;

	//std::vector<bool> ioOut;

	//std::vector<float> ai;

	//std::vector<float> ao;

	//std::vector<bool> si;

	//std::vector<bool> so;

	//std::vector<float> localRegister;

	//std::vector<float> globalRegister;

	//std::vector<struct PointPro> pointRegister;

	//std::vector<int>  timerRegister;

	//std::vector<struct PlRegStruct > plRegister;

	std::string currentTime;

	std::vector<float> axisTorque;

	std::vector<float> axisSpeed;

	std::vector<int> axisPosition;

	std::vector<int> axisFollowOffset;

	struct CurrentRunFile currentRunFile;

	int currentRobotID;//当前使用的机器人ID 2017.03.10

	//std::string powerOnTime;//上电时间(2017.02.10修改)

	//std::string totalPowerOnTime;//累计上电时间(2017.02.14修改)

	//std::string totalStartMachineOnTime;//第一次开机至今上电时间(2017.02.14修改)

	//std::string servoOnTime;//使能时间(2017.02.10修改)
};

//io部分转移到此处
struct UpdateDataLv3
{
	std::vector<bool> ioIn;

	std::vector<bool> ioOut;

	std::vector<float> ai;

	std::vector<float> ao;

	std::vector<bool> si;

	std::vector<bool> so;

	std::vector<float> localRegister;

	std::vector<float> globalRegister;

	std::vector<struct PointPro > pointRegister;

	std::vector<float>  timerRegister;

	std::vector<struct PlRegStruct > plRegister;

	std::string powerOnTime;//上电时间(2017.02.10修改)

	std::string totalPowerOnTime;//累计上电时间(2017.02.14修改)

	std::string totalStartMachineOnTime;//第一次开机至今上电时间(2017.02.14修改)

	std::string servoOnTime;//使能时间(2017.02.10修改)

	std::vector <struct CommRobotInfo>  robotInfoList;//其他机器人的信息也要更新
};


//***************类型变量部分********************************
/**
 * @brief message               控制器消息[LV2]
 */
//std::vector<struct Message> messageVector;//20161108

/**
 * @brief globalSafePointFlag   安全开关是否打开的标志[LV2]
 */
//int globalSafePointFlag;

/**
 * @brief globalHandSwitch      使能开关[LV2]
 */
//int globalHandSwitch;
/**
 * @brief globalProSpeed        自动运行速度[LV2] 2017-02-24
 */
//int globalProSpeed;
/**
 * @brief globalManSpeed        手动运行速度[LV2] 2017-02-24
 */
//int globalManSpeed;
/**
 * @brief globalHandRunStatus   手动运行状态，（手动单步，手动连续）[LV2]
 */
//int globalHandRunStatus;

/**
 * @brief globalZeroCtrlFlag    回零的第二个标志位，判断回零状态（正在原点回零，回零完成）[LV2]
 */
//int globalZeroCtrlFlag;
/**
 * @brief globalCoordinate      手动坐标系[LV2]
 */
//int globalCoordinate;
/**
 * @brief globalCurrentState    程序的运行状态，（运行，暂停，停止）[LV2]
 */
//int globalCurrentState;
/**
 * @brief globalHandState       程序的运行模式（T1/T2/Auto/EXT）[LV2]
 */
//int globalHandState;
/**
 * @brief globalServoState      伺服状态[LV2]
 */
//int globalServoState;

/**
 * @brief globalZeroStatus      回零状态（是否回过零，按键Btn显示）[LV2]
 */
//int globalZeroStatus;
/**
 * @brief globalLoginStatus     登陆状态(不需要,自切换页面用)
 */
//bool globalLoginStatus;

/**
 * @brief globalSerialStatus    序列号状态（有、无序列号）[LV1]
 */
//int globalSerialStatus;
/**
 * @brief globalRegStatus       注册状态（有效、快要过期、已经过期、永久有效）[LV1]
 */
//int globalRegStatus;
/**
 * @brief emergencyStatus       急停状态[LV2]
 */
//int emergencyStatus;
/**
 * @brief globalMotorType       电机类型[LV1]
 */
//int globalMotorType;


/**
 * @brief globalPosType         点位的保存方式:（0代表X、Y、Z、W、P、R），（1代表Deg）[LV2]
 */
//int globalPosType;
/**
 * @brief globalDefaultUserNum  默认(当前)的用户坐标[LV2]
 */
//int globalDefaultUserNum;
/**
 * @brief globalDefaultToolNum  默认的工具坐标[LV2]
 */
//int globalDefaultToolNum;


/**
 * @brief globalSerialValue     序列号[LV1]
 */
//std::string globalSerialValue;
/**
 * @brief globalLockMachTime    锁机时间[LV1]
 */
//std::string globalLockMachTime;

/**
 * @brief startType             启动方式()[LV2]
 */
//int startType;
/**
 * @brief mainProgramVersion    控制器版本号[LV1]
 */
//std::string mainProgramVersion;

/**
 * @brief componentVersionList  组件版本列表[LV1]
 */
//std::vector<struct ComponentVersion> componentVersionList;

/**
 * @brief multiUserInfo         多用户信息[LV1]
 */
//std::vector<struct UserInfo> multiUserInfo;
/**
 * @brief currentLanguage       当期语言[LV1]
 */
//int currentLanguage;

/**
 * @brief currentPositionJoint  当前点 关节信息[LV2]
 */
//struct PointPro currentPositionJoint;
/**
 * @brief currentPositionWorld  当前点 世界坐标[LV2]
 */
//struct PointPro currentPositionWorld;
/**
 * @brief currentPositionTool   当前点 工具坐标[LV2]
 */
//struct PointPro currentPositionTool;
/**
 * @brief currentPositionUser   当前点 用户坐标[LV2]
 */
//struct PointPro currentPositionUser;

/**
 * @brief axisLimit             轴软限位[LV1](改动再更新)
 */
//std::vector<std::vector <float> >  axisLimit;

/**
 * @brief axisUnit              轴单位[LV1]
 */
//std::vector<int> axisUnit;

/**
 * @brief robotAxisCount        轴数[LV1]
 */
//int robotAxisCount;
/**
 * @brief extAxisCount          外部轴数[LV1]
 */
//int extAxisCount;



/**
 * @brief ioIn                  DI[LV2]
 */
//std::vector<int> ioIn;
/**
 * @brief ioOut                 DO[LV2]
 */
//std::vector<int> ioOut;
/**
 * @brief ai                    AI[LV2]
 */
//std::vector<float> ai;
/**
 * @brief ao                    AO[LV2]
 */
//std::vector<float> ao;
/**
 * @brief si                    SI[LV2]
 */
//std::vector<int> si;
/**
 * @brief so                    SO[LV2]
 */
//std::vector<int> so;
/**
 * @brief localRegister         局部寄存器[LV2]
 */
//std::vector<float> localRegister;
/**
 * @brief globalRegister        全局寄存器[LV2]
 */
//std::vector<float> globalRegister;
/**
 * @brief pointRegister         PR[LV2]
 */
//std::vector<struct PointPro> pointRegister;
/**
 * @brief timerRegister         时间寄存器[LV2]
 */
//std::vector<int>  timerRegister;
/**
 * @brief plRegister            PL[LV2]
 */
//std::vector<std::vector <int> > plRegister;

/**
 * @brief currentTime           当前时间[LV2]
 */
//std::string currentTime;
/**
 * @brief controllerIp          控制器IP[LV1]
 */
//std::string controllerIp;
/**
 * @brief controllerMac         控制器MAC[LV1]
 */
//std::string controllerMac;

/**
 * @brief axisTorque            电机力矩[LV2]
 */
//std::vector<float> axisTorque;
/**
 * @brief axisSpeed             电机速度[LV2]
 */
//std::vector<float> axisSpeed;
/**
 * @brief axisPosition          电机位置[LV2]
 */
//std::vector<int> axisPosition;
/**
 * @brief axisFollowOffset      电机跟随误差[LV2]
 */
//std::vector<int> axisFollowOffset;

/**
 * @brief currentRunFile		当前运行程序[LV2]
 */
//struct CurrentRunFile currentRunFile;

/**
 * @brief defaultUserFile       缺省程序[LV2]
 */
//std::string defaultUserFile;

/**
 * @brief controllerIsConnected 连接状态(自用)
 */
//int controllerIsConnected;

/**
 * @brief controllerFileAddress 映射地址(自用)
 */
//std::string controllerFileAddress;

/**
 * @brief robotInfoList 		机器人信息[LV1]
 */
//std::vector <struct CommRobotInfo>  robotInfoList;

/**
 * @brief powerOnTime			上电时间(hmi自用)
 */
//int powerOnTime;

/**
 * @brief servoOnTime			使能时间(hmi自用)
 */
//int servoOnTime;

//***************接口函数部分********************************
//测试用
int testFoundation(struct UserInfo userInfo,struct UserInfo &returnnfo);
/**
 * @brief setUToolActive    工具坐标系切换 (0~9)
 * @param userInfo          用户信息
 * @param n                 切换编号
 * @param returnFlag        默认返回(RECV OK)
 * @return
 */
int setUToolActive(struct UserInfo userInfo,int number,int &returnFlag);

/**
 * @brief setUFrameActive   用户坐标系切换(0~9)
 * @param userInfo          用户信息
 * @param n                 切换编号
 * @param returnFlag        默认返回(RECV OK)
 * @return
 */
int setUFrameActive(struct UserInfo userInfo,int number,int &returnFlag);

/**
 * @brief getUFrameActive 获取激活的工具坐标系号码(0~9)
 * @param n
 * @param returnUToolNum
 */
int getUToolActive(struct UserInfo userInfo,int &returnUToolNum);

/**
 * @brief getUFrameActive 获取激活的用户坐标系号码(0~9)
 * @param n
 * @param returnUFrameNum
 */
int getUFrameActive(struct UserInfo userInfo,int &returnUFrameNum);

/**
 * @brief UpdateControllerInfoLevel hmi获取更新数据函数
 * Level1 等级分类
 * Level2
 * returnInfo 返回信息类型未定(待定)
 * @return
 */
int updateControllerInfoLevel1(struct UserInfo userInfo,int currentRobotId,struct UpdateDataLv1 &updateDataLv1);
int updateControllerInfoLevel2(struct UserInfo userInfo,struct UpdateDataLv2 &updateDataLv2);
int updateControllerInfoLevel3(struct UserInfo userInfo,struct UpdateDataLv3 &updateDataLv3);
int updateControllerMessage(struct UserInfo userInfo,std::vector<struct Message> &messageVector);

/**
 * @brief initControllerStatus      控制器初始化是否完成 状态判断
 * @return
 */
int initControllerStatus(struct UserInfo userInfo,int &initStatus);

/**
 * @brief UpdateUserProgramFile     更新用户程序hmi通过ftp映射更新文件,通过md5校验,通知控制器重新获取文件进行解析
 * @param fileName                  程序名
 * @param md5                       MD5校验码
 * @param returnFlag
 * @return
 */
int updateUserProgramFile(struct UserInfo userInfo,std::string fileName,
                          std::string md5,int &returnFlag);

/**
  * @brief 			把关节坐标转换为笛卡尔坐标或者把笛卡尔坐标转换为关节坐标
  * @param inputPointPro	输入的点位信息
  * @return　PointPro		转换后的点位数据
  */
int changePointType(struct UserInfo userInfo,struct PointPro inputPointPro,struct PointPro &pointPro);

/**
 * @brief changePasswd                     修改密码，管理员可以更改所有的的密码，普通用户只能修改普通用户密码
 * @param userInfo                  用户信息
 * @param oldPassed                    旧密码
 * @param newPasswd			新密码
 * @return				0标示失败,1标示成功
 */
int changePasswd(struct UserInfo userInfo,int changeAccount,std::string oldPassed,std::string newPasswd,int &returnFlag);

/**
 * @brief loginController                     修改密码，管理员可以更改所有的的密码，普通用户只能修改普通用户密码
 * @param userInfo                  用户信息
 * @return				0标示失败,1标示成功
 */
int loginController(struct UserInfo userInfo,int &returnFlag);

/**
 * @brief setDo                     设置DO
 * @param ioOutNum                  DO号
 * @param nOffOn                    ON OFF
 * @param returnFlag
 * @return
 */
int setDo(struct UserInfo userInfo,int ioOutNum,int nOffOn,int &returnFlag);

/**
 * @brief setManualSpeedPercent     设置 manual速度百分比 float 2017-02-24修改变量类型
 * @param nSpeedValue
 * @param returnFlag
 * @return
 */
int setManualSpeedPercent(struct UserInfo userInfo,float nSpeedValue,int &returnFlag);
/**
 * @brief setManualSpeedPercent     设置 auto速度百分比 float 2017-02-24修改变量类型
 * @param nSpeedValue
 * @param returnFlag
 * @return
 */
int setAutoSpeedPercent(struct UserInfo userInfo,float nSpeedValue,int &returnFlag);

/**
 * @brief setHandWheel              滚轮
 * @param axisNumber                轴
 * @param direction                 方向
 * @param velocity                  增量速度
 * @param returnFlag
 * @return
 */
int setHandWheel(struct UserInfo userInfo,int axisNumber,int direction,int velocity,int &returnFlag);

/**
 * @brief jogRun                    寸动
 * @param axisNumber                轴
 * @param direction                 方向
 * @param returnFlag
 * @return
 */
int jogRun(struct UserInfo userInfo,int axisNumber,int direction,int &returnFlag);

/**
 * @brief setProgramFileName        设置程序运行filename(openfile)
 * @param programFileName
 * @param returnFlag
 * @return
 */
int setProgramFileName(struct UserInfo userInfo,std::string programFileName,int &returnFlag);

/**
 * @brief setProgramRunLine         设置程序运行 行
 * @param line
 * @param returnFlag
 * @return
 */
int setProgramRunLine(struct UserInfo userInfo,int line,int &returnFlag);

/**
 * @brief setRunModel               程序运行的模式设置
 * @param runModel                  0 T1手动\1 T2手动\2 自动\3 EX
 * @param returnFlag
 * @return
 */
int setRunModel(struct UserInfo userInfo,int runModel,int &returnFlag);

/**
 * @brief setDebugModel             手动运行
 * @param debugModel                0 单步\1 连续
 * @param returnFlag
 * @return
 */
int setDebugModel(struct UserInfo userInfo,int debugModel,int &returnFlag);

/**
 * @brief setJogCoordinator         关节/全局/工具/用户坐标 设置
 * @param coordinator               0   1   2    3
 * @param returnFlag
 * @return
 */
int setJogCoordinator(struct UserInfo userInfo,int coordinator,int &returnFlag);

/**
 * @brief moveToPoint		移动到点
 * @param userInfo			用户信息   
 * @param moveParameter		移动到点的点位信息参数
 * @param returnFlag		返回状态标志位
 * @return
 */
int moveToPoint(struct UserInfo userInfo,struct MoveParameter moveParameter,int &returnFlag);

/**
 * @brief stepRun                   运行(底部按钮)
 * @return
 */
int programRun(struct UserInfo userInfo,int &returnFlag);

/**
 * @brief ceaseRun                  暂停(底部按钮)
 * @return
 */
int programCease(struct UserInfo userInfo,int &returnFlag);

/**
 * @brief resetRun                  重置(stop)(底部按钮)
 * @return
 */
int programReset(struct UserInfo userInfo,int &returnFlag);

/**
 * @brief returnZeroPoint           回零
 * @param userInfo
 * @param axisNumber
 * @return
 */
int returnZeroPoint(struct UserInfo userInfo,int axisNumber,int &returnFlag);

/**
 * @brief returnAllZeroPoint		回零(全部)
 * @param userInfo
 * @param axisNumber
 * @return
 */
int returnAllZeroPoint(struct UserInfo userInfo,int &returnFlag);

/**
 * @brief controllerShutDown        关机指令
 * @param userInfo
 * @param returnFlag
 * @return
 */
int controllerShutDown(struct UserInfo userInfo,int &returnFlag);


/**
 * @brief setManualServon           设置伺服使能
 * @param userInfo
 * @param nServOffOn
 * @param returnFlag
 * @return
 */
int setManualServon(struct UserInfo userInfo,int nServOffOn,int &returnFlag);


/**
 * @brief setRegisterNumber         输入注册码(修改返回值)
 * @param registerString
 * @return
 */
int setRegisterNumber(struct UserInfo userInfo,std::string registerString,struct ReturnRegisterStatus &returnStatus);


/**
 * @brief getTcpConnectState        获取当前是否断开链接
 * @param userInfo
 * @param returnFlag
 * @return
 */
int getTcpConnectState(struct UserInfo userInfo,int &returnFlag);


/**
 * @brief setClearAllCounter        清空所有产量
 * @param userInfo
 * @param returnFlag
 * @return
 */
int setClearAllCounter(struct UserInfo userInfo,int &returnFlag);

/**
 * @brief setClearCurrentCounter    清空当前产量
 * @param userInfo
 * @param returnFlag
 * @return
 */
int setClearCurrentCounter(struct UserInfo userInfo,int &returnFlag);


/**
 * @brief setRestoreFactory         恢复出厂设置,通知控制器重新启动
 * @param userInfo
 * @param returnFlag
 * @return
 */
int setRestoreFactory(struct UserInfo userInfo,int &returnFlag);


/**
 * @brief setCoordMode              坐标系设置,关节,世界,用户,工具切换
 * @param userInfo
 * @param nCoordId
 * @param returnFlag
 * @return
 */
int setCoordMode(struct UserInfo userInfo,int nCoordId,int &returnFlag);


/**
 * @brief setMsgClear               清除消息
 * @param userInfo
 * @param messageId
 * @param returnFlag
 * @return
 */
int setMsgClear(struct UserInfo userInfo,int messageId,int &returnFlag);



/**
 * @brief SetSingleCaliber          单轴零点标定设置
 * @param userInfo
 * @param asixId
 * @param returnFlag
 * @return
 */
int setSingleCaliber(struct UserInfo userInfo,int asixId,int &returnFlag);
/**
 * @brief SetAllCaliber             零点标定设置
 * @param userInfo
 * @param asixId
 * @param returnFlag
 * @return
 */
int setAllCaliber(struct UserInfo userInfo,int &returnFlag);


/**
 * @brief clearPlRegister           清空栈板暂存器
 * @param userInfo
 * @param palletNumber
 * @param returnFlag
 * @return
 */
int clearPlRegister(struct UserInfo userInfo,int palletNumber,int &returnFlag);

//
/**
 * @brief setPlRegister             栈板寄存器修改生效
 * @param userInfo
 * @param palletNumber
 * @param rowColumnLayer
 * @param returnFlag
 * @return
 */
int setPlRegister(struct UserInfo userInfo,int palletNumber,struct PlRegStruct plReg,int &returnFlag);

/**
 * @brief clearAllPlRegister        清空Pl寄存器
 * @param userInfo
 * @param returnFlag
 * @return
 */
int clearAllPlRegister(struct UserInfo userInfo,int &returnFlag);


/**
 * @brief setLocalRegister          设置局部R寄存器
 * @param userInfo
 * @param number
 * @param value
 * @param returnFlag
 * @return
 */
int setLocalRegister(struct UserInfo userInfo,int number, float value,int &returnFlag);
/**
 * @brief clearAllLocalRegister     清除所有局部寄存器
 * @param userInfo
 * @param returnFlag
 * @return
 */
int clearAllLocalRegister(struct UserInfo userInfo,int &returnFlag);
/**
 * @brief setGlobalRegister         设置全局R寄存器
 * @param userInfo
 * @param number
 * @param value
 * @param returnFlag
 * @return
 */
int setGlobalRegister(struct UserInfo userInfo,int number, float value,int &returnFlag);
/**
 * @brief clearAllGlobalRegister    清除所有全局寄存器
 * @param userInfo
 * @param returnFlag
 * @return
 */
int clearAllGlobalRegister(struct UserInfo userInfo,int &returnFlag);


/**
 * @brief clearAllPrRegister        清除所有PR寄存器
 * @param userInfo
 * @param returnFlag
 * @return
 */
int clearAllPrRegister(struct UserInfo userInfo,int &returnFlag);
/**
 * @brief setPrRegister             设置PR寄存器
 * @param userInfo
 * @param number
 * @param point
 * @param returnFlag
 * @return
 */
int setPrRegister(struct UserInfo userInfo,int number,struct PointPro point,int &returnFlag);


/**
 * @brief updateControllerProgram               发送升级包
 * @param userInfo
 * @param fileLocation
 * @param returnFlag
 * @return
 */
//int updateControllerProgram(struct UserInfo userInfo,std::string fileLocation,int &returnFlag);

/**
 * @brief restoreControllerProgramBackupFile    还原
 * @param userInfo
 * @param fileLocation
 * @param returnFlag
 * @return
 */
//int restoreControllerProgramBackupFile(struct UserInfo userInfo,std::string fileLocation,int &returnFlag);

/**
 * @brief backupControllerProgram               备份
 * @param userInfo
 * @param fileLocation
 * @param returnFlag
 * @return
 */
int backupControllerProgram(struct UserInfo userInfo,std::string fileLocation,int &returnFlag);

/**
 * @brief RestoreFactory				恢复出厂设置
 * @param userInfo
 * @param returnFlag
 */
//int restoreFactory(struct UserInfo userInfo,int &returnFlag);

/**
 * @brief setIpAddress					设置ip地址
 * @param userInfo						用户信息
 * @param controllerIpGroupInfo         ip用户组信息
 * @param returnFlag
 * @return
 */
int setIpAddress(struct UserInfo userInfo,struct ControllerIpGroupInfo controllerIpGroupInfo,int &returnFlag);
/**
 * @brief setMacAddress                 设置mac地址
 * @param userInfo                      用户信息
 * @param macAddress                    mac地址
 * @param returnFlag
 * @return
 */
int setMacAddress(struct UserInfo userInfo,std::string macAddress,int &returnFlag);
/**
 * @brief readDefaultFileName           读取缺省文件(开机时候获取缺省文件,并且打开对应文件)
 * @param userInfo                      用户信息
 * @param returnName
 * @return
 */
int readDefaultFileName(struct UserInfo userInfo,std::string &returnName);

/**
 * @brief setLanguage           		设置语言
 * @param userInfo                      用户信息
 * @param languageID
 * @return
 */
int setLanguage(struct UserInfo userInfo,int languageID,int &returnFlag);

/**
 * @brief jogRunDog           		寸动 喂狗专用
 * @param userInfo                  用户信息
 * @return
 */
int jogRunDog(struct UserInfo userInfo,int &returnFlag);

//(2017.02.10修改)新添加接口
/**
 * @brief calculateToolCoordinate 计算工具坐标系
 * @param resultToolCoordinate
 */
int calculateToolCoordinate(struct UserInfo userInfo,int robotID,struct HmiToolCoordinateInformation sendToolCoordinate,struct HmiToolCoordinateInformation &resultToolCoordinate);

/**
 * @brief calculateUserCoordinate 计算用户坐标系
 * @return resultUserCoordinate
 */
int calculateUserCoordinate(struct UserInfo userInfo,int robotID,struct HmiUserCoordinateInformation sendUserCoordinate,struct HmiUserCoordinateInformation &resultUserCoordinate);

/**
 * @brief setMsgClear               清除所有消息
 * @param userInfo
 * @param returnFlag
 * @return
 */
int setAllMsgClear(struct UserInfo userInfo,int &returnFlag);


/**
 * @brief setSo                     设置SO
 * @param soNum						SO号
 * @param nOffOn                    ON OFF
 * @param returnFlag
 * @return
 */
int setSo(struct UserInfo userInfo,int soNum,int nOffOn,int &returnFlag);

/**
 * @brief setAo                     设置AO
 * @param aoNum						AO号
 * @param aoValue                   AO值
 * @param returnFlag
 * @return
 */
int setAo(struct UserInfo userInfo,int aoNum,float aoValue,int &returnFlag);

/**
 * @brief changeAxisLimit			设置 软限位
 * @param changeLimit				软限位值
 * @return
 */
int changeAxisLimit(struct UserInfo userInfo,std::vector<struct AxisLimit> changeLimit,int &returnFlag);

/**
 * @brief getStoreStatus			hmi获取 存储状态
 * @return
 */
int getStoreStatus(struct UserInfo userInfo,struct StoreStatus &storeStatus);//获取 存储状态

/**
 * @brief getToolCoordinateInformation 获取工具坐标系列表 2017-02-24添加
 * @param toolList
 */
int getToolCoordinateInformation(struct UserInfo userInfo,int robotID,std::vector<struct HmiToolCoordinateInformation> &toolList);

/**
 * @brief getUserCoordinateInformation 获取用户坐标系列表 2017-02-24添加
 * @param userList
 */
int getUserCoordinateInformation(struct UserInfo userInfo,int robotID,std::vector<struct HmiUserCoordinateInformation> &userList);

/**
 * @brief getStoreStatus			设置安全点值 2017-02-24添加
 * @return
 */
int changeSafePoint(struct UserInfo userInfo,struct PointPro safePoint,int &returnFlag);

/**
 * @brief getStoreStatus			安全点开启关闭 2017-02-24添加
 * @return
 */
int setSafePoint(struct UserInfo userInfo,bool value,int &returnFlag);

/**
 * @brief setTimerRegister			设置时间寄存器 2017-02-24添加
 * @return
 */
int setTimerRegister(struct UserInfo userInfo,int timerNumber,int changeStatus,int &returnFlag);

/**
 * @brief setStartType				设置启动方式 2017-03-07添加
 * @return
 */
int setStartType(struct UserInfo userInfo,int type,std::string &returnString);

// 2017 07 07 添加
/**
 * @brief connectVrep				连接vrep
 * @return
 */
int connectVrep(struct UserInfo userInfo,std::string ip,int port,int &returnFlag);

/**
 * @brief disconnectVrep			断开连接vrep
 * @return
 */
int disconnectVrep(struct UserInfo userInfo,int &returnFlag);

/**
 * @brief setVrepServoType			设置vrep伺服模式
 * @return
 */
int setVrepServoType(struct UserInfo userInfo,int type,int &returnFlag);

/**
 * @brief setVrepIoType				设置vrep IO模式	
 * @return
 */
int setVrepIoType(struct UserInfo userInfo,int type,int &returnFlag);

//hualei add
int feedWatchDog(struct UserInfo userInfo,int &returnFlag);

int getOdometer(struct UserInfo userInfo,int robotIdIn,VehicleVelocity& vehicleVelFeedbackOut,
                VehiclePosition& vehiclePositionFeedbackOut);

int vehicleAuto(struct UserInfo userInfo,int robotIdIn, double xMove, double yMove, double rotate);

#endif // HMIAPI_H
